// 购物车状态
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart.js'
export default {
  namespaced: true,
  state: () => ({
    cartList: []
  }),
  getters: {
    // 数组的累加 reduce :参数a接收c为count每一项相加的值,c的初始值为空数组
    // 商品总数量:把cartList中所有项的cartList累加
    allCount (state) {
      return state.cartList.reduce((a, c) => a + c.count, 0)
    },
    // 商品总价格:把cartList中所有项的 count * price
    allPrice (state) {
      return state.cartList.reduce((a, c) => a + c.count * c.price, 0)
    },
    // selected的商品数量,被选中的就为true
    selectedCount (state) {
      return state.cartList.filter(item => item.selected).reduce((a, c) => a + c.count, 0)
    },
    // selected的商品总价格
    selectedPrice (state) {
      return state.cartList.filter(item => item.selected).reduce((a, c) => a + c.count * c.price, 0)
    },
    // 单选影响多选:都为true全选才被选择,不然则不被选中
    isAllCheck (state) {
      return state.cartList.every(item => item.selected)// 都为true时,返回的才是true
    }
  },
  mutations: {
    setCartList (state, cartList) {
      state.cartList = cartList
    },
    // 更改勾选状态(测试使用)
    singleCheck (state, { skuId, selected }) {
      // 1.找到对应项 2.赋值操作
      const item = state.cartList.find(item => item.skuId === skuId)
      item.selected = selected
    },
    // 单独获取cartList中的count
    setCartListCount (state, { count }) {
      state.cartList.count = count
    }
  },
  actions: {
    // 加入购物车
    async asynccartList (ctx, { skuId, count }) {
      await insertCart({ skuId, count })
      // 获取登录后的购物车列表
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车
    async asyncdeleteCart (ctx, ids) {
      // 删除
      await deleteCart(ids)
      // 获取登录后的购物车列表
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
    },
    // 购物车selected状态,单选
    async asyncSingleCheck (ctx, goods) {
      await updateCart(goods)
      // 获取登录后的购物车列表
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
      // 单选更改状态在mutation中更改
      // 待解决: 为什么调用了购物车状态后,cartList里的数据selected状态也跟着改变?
    },
    // 多选
    async asyncAllCheck (ctx, selected) {
      await checkAllCart({
        selected,
        // ids:所有的商品skuId集合
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 获取登录后的购物车列表
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
    }
  }

}
